package org.abettor.angleworm.media;

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

/**
 * <p>媒体传输程序管理类，用于管理媒体传输程序工厂类，获取媒体传输程序类实例</p>
 * <p>被管理的媒体传输程序工厂类，在被ClassLoader加载的时候，必须调用register方法进行注册，且只能注册一次。
 * 没有注册的工厂类，将无法被本类调用。</p>
 * @author shawn
 *
 */
public abstract class MediaTransmitterManager
{
	private static Set<MediaTransmitterFactory> factories = Collections.synchronizedSet(new HashSet<MediaTransmitterFactory>());

	/**
	 * 注册媒体传输程序工厂类，以便等待媒体传输程序管理类调用，生成媒体传输程序实例
	 * @param factory
	 */
	public static void register(MediaTransmitterFactory factory)
	{
		if(factory != null)
		{
			factories.add(factory);
		}
	}

	/**
	 * 通过遍历所有注册的媒体传输程序工厂类，找出合适的工厂类，并应用其生成媒体传输程序实例
	 * @param targetUrl 传输目标URL
	 * @param properties 工厂类所需使用的附加信息
	 * @throws IOException 
	 */
	public static MediaTransmitter getTransmitter(String targetUrl, Properties properties) throws IOException
	{
		for(MediaTransmitterFactory factory : factories)
		{
			if(factory.support(targetUrl))
			{
				return factory.createTransmitter(targetUrl, properties);
			}
		}

		return null;
	}
}
